package com.wande.dataplatform.filecollection.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * 文件采集配置属性
 *
 * @author wande
 */
@Data
@Component
@ConfigurationProperties(prefix = "file-collection")
public class FileCollectionProperties {

    /**
     * 文件上传配置
     */
    private Upload upload = new Upload();

    /**
     * 解析器配置
     */
    private Parser parser = new Parser();

    /**
     * 数据加载配置
     */
    private Loader loader = new Loader();

    /**
     * 调度配置
     */
    private Scheduler scheduler = new Scheduler();

    /**
     * 缓存配置
     */
    private Cache cache = new Cache();

    /**
     * 性能监控配置
     */
    private Performance performance = new Performance();

    /**
     * 文件上传配置
     */
    @Data
    public static class Upload {
        /**
         * 最大文件大小（字节）
         */
        private Long maxFileSize = 500 * 1024 * 1024L; // 500MB

        /**
         * 允许的文件类型（逗号分隔）
         */
        private String allowedTypes = "CSV,XLS,XLSX,XML,JSON,ACCDB,SQL,PDF,DOC,DOCX,TXT";

        /**
         * 临时目录
         */
        private String tempDir = "/tmp/file-collection";
    }

    /**
     * 解析器配置
     */
    @Data
    public static class Parser {
        /**
         * 批量大小
         */
        private Integer batchSize = 1000;

        /**
         * 线程池大小
         */
        private Integer threadPoolSize = 4;

        /**
         * 流式解析阈值（字节）
         */
        private Long streamThreshold = 100 * 1024 * 1024L; // 100MB

        /**
         * 默认编码
         */
        private String defaultEncoding = "UTF-8";
    }

    /**
     * 数据加载配置
     */
    @Data
    public static class Loader {
        /**
         * 批量大小
         */
        private Integer batchSize = 1000;

        /**
         * 超时时间（秒）
         */
        private Integer timeout = 300;

        /**
         * 重试次数
         */
        private Integer retryTimes = 3;

        /**
         * 错误处理策略
         */
        private String errorHandlingStrategy = "SKIP_RECORD";
    }

    /**
     * 调度配置
     */
    @Data
    public static class Scheduler {
        /**
         * 是否启用
         */
        private Boolean enabled = true;

        /**
         * 同步间隔（秒）
         */
        private Integer syncInterval = 60;
    }

    /**
     * 缓存配置
     */
    @Data
    public static class Cache {
        /**
         * 是否启用缓存
         */
        private Boolean enabled = true;

        /**
         * 映射规则缓存过期时间（小时）
         */
        private Integer mappingRuleExpireHours = 24;

        /**
         * 表结构缓存过期时间（小时）
         */
        private Integer tableStructureExpireHours = 24;
    }

    /**
     * 性能监控配置
     */
    @Data
    public static class Performance {
        /**
         * 是否启用性能监控
         */
        private Boolean monitorEnabled = true;

        /**
         * 指标日志输出间隔（秒）
         */
        private Integer metricsLogInterval = 300;
    }
}
